package com.tsysstems.clientEmployee;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * @author vlad
 *
 * Класс в котором производится управление соединением, сокетами  и потоками ввода/вывода.
 */
public class ClientConnectionManager {
	private final Logger logger = LoggerFactory.getLogger(getClass());
	
	//Сокет
	private Socket socket;
	
	//Выходной поток
	ObjectOutputStream outputStream;
	
	//Входной поток
	ObjectInputStream inputStream;
	
	private static ClientConnectionManager instance; 
	
	private ClientConnectionManager(){
		
	}
	
	public static ClientConnectionManager getInstance() {
		if (instance == null) {	
			instance = new ClientConnectionManager();
		}
		
		return instance;
	}
	
	/**
	 * Метод устанавливает соединение и получает потоки ввода/вывода.
	 * @param host - адрес сервера
	 * @param port - порт к которому будем подключаться
	 * @throws UnknownHostException
	 * @throws IOException
	 */
	public void connect(String host, int port) throws UnknownHostException, IOException {
		socket = new Socket(host, port);
		logger.info("Client connect to host: {}", host);
		
		outputStream = new ObjectOutputStream(socket.getOutputStream());
		inputStream = new ObjectInputStream(socket.getInputStream());
	}
	
	/**
	 * Селектор сокета.
	 * @return сокет
	 */
	public Socket getConnection() {
		return socket;
	}
	
	/**
	 * Селектор выходного потока
	 * @return выходной поток
	 */
	public ObjectOutputStream getOutput() {
		return outputStream;
	}
	
	/**
	 * Селектор входного потока
	 * @return  входной поток
	 */
	public ObjectInputStream getInput() {
		return inputStream;
	}
	
	/**
	 * Метод, закрывающий соединение.
	 */
	public void closeConnection() {
		try {
			try {
				if (outputStream != null) {
					outputStream.close();
				}
				
				if (inputStream != null) {
					inputStream.close();
				}
			} catch (IOException e) {
				logger.error("Can't close stream", e);
			}
			
			if (socket != null) {
				socket.close();
			}			
		} catch (IOException e) {
			logger.error("IOException", e);
		}
	}
}
